草庐IT

c - WaitForMultipleObjects 堆栈

全部标签

c++ - 可以将堆栈对象地址提供给 placement new 吗?

忽略这种做法的用处。(当然,我们欢迎现实生活中的例子。)例如,以下程序输出a的正确值:#includeusingnamespacestd;intmain(){inta=11111;inti=30;int*pi=new(&i)int();cout但是new-allocation不应该在i附近创建一些簿记信息吗?(为了正确的后续释放),在这种情况下应该会破坏i周围的堆栈。? 最佳答案 是的,使用指向堆栈上对象的指针执行placement-new是完全可以的。它只会使用那个特定的指针来构造对象。Placement-new实际上并不是分配任

C++ 最大 std::string 长度由堆栈大小或堆大小决定?

如问题中所问。std::stringmyVar;它可以容纳的最大字符是由堆栈还是堆决定的?谢谢 最佳答案 默认情况下,为std::string分配的内存是动态分配的。注意std::string有一个max_size()函数返回实现支持的最大字符数。不过,这样做的用处值得怀疑,因为它是实现的最大值,并且没有考虑其他资源,如内存。您的实际限制要低得多。(尝试分配4GB的连续内存,或者考虑其他地方的内存耗尽。) 关于C++最大std::string长度由堆栈大小或堆大小决定?,我们在Stack

c++ - 我可以使用堆栈协程作为在非常堆栈协程中定义的 steady_timer 的等待处理程序吗?

我可以通过以下方式使用stackfulcoroutine和boost::asio::steady_timer::async_wait吗?关键是(我的理解,不确定)在等待期间,局部变量timer不在堆栈上,因此无法访问。那么回调能否正常进行呢?(仅供引用,它在我的Mac上使用clang++5.0运行良好。)boost::asio::io_serviceio;voidWork(boost::asio::yield_contextyield){boost::asio::steady_timertimer(io);timer.expires_from_now(std::chrono::seco

c++ - 如何在 C++ 程序崩溃时获取堆栈跟踪? (使用 msvc8/2005)

有时我的C++程序在Debug模式下崩溃,我得到的是一个消息框,提示某些内部内存管理例程(访问未分配的内存等)中的断言失败。但我不知道那是从哪里调用的,因为我没有得到任何堆栈跟踪。我如何获取堆栈跟踪或至少查看它在我的代码中失败的位置(而不是库/内置例程)? 最佳答案 如果发生崩溃,无论您使用的是调试版本还是发布版本,都可以获得有关崩溃发生位置的信息。即使您在没有源代码的计算机上,也可以看到调用堆栈。为此,您需要使用通过EXE构建的PDB文件。将PDB文件放在与崩溃的EXE相同的目录中。注意:即使您拥有相同的源代码,构建两次并使用第一

c++ - C++ 程序中堆栈溢出的症状是什么?

我刚刚遇到一个问题,当本地对象试图调用一个非常简单的过程时,HPUX上的线程C++程序中的堆栈溢出导致了SEGV_MAPERR。我困惑了一会儿,但幸运的是我和一个认识到这是堆栈大小问题的人交谈,我们能够通过增加线程可用的堆栈大小来解决这个问题。我如何识别堆栈何时溢出?Windows/linux/hpux上的症状是否不同? 最佳答案 假设您不在一个会停止您的应用程序并说“堆栈溢出”的平台上,我怀疑您会看到与任何类型的缓冲区溢出相同的行为。堆栈只是为您的程序预分配的另一block内存,如果您超出了这些范围……那么祝您好运!谁知道你会踩到

c++ - 此 C++ 堆栈分配器的改进?

对基于堆栈的分配器有什么建议吗?(除了建议使用带有私有(private)/公共(public)成员的类)structHeap{void*heap_start;void*heap_end;size_tmax_end;Heap(size_tsize){heap_start=malloc(size);heap_end=heap_start;max_end=size+(size_t)heap_start;}~Heap(){::free(heap_start);}void*allocate(size_tbytes){size_tnew_end=((size_t)heap_end)+bytes;i

c++ - 堆栈内存可以在函数内自动分配吗?

如果之前有人问过这个问题,我很抱歉,但我没有找到任何东西......对于“普通”x86架构:当我在C++中调用一个大函数时,是否会立即为所有堆栈变量分配内存?或者是否有编译器可以(并且确实)修改堆栈大小,即使函数未完成。例如,如果一个新的作用域开始:intlargeFunction(){inta=1;intb=2;//....longcode....{//newscopeintc=5;//....codeagain....}//.....在单独范围的开头,变量c的调用堆栈是否也“增长”并在其末尾“收缩”?或者当前的编译器是否总是会产生影响函数入口处的堆栈指针和返回值的代码?提前感谢您的

c++ - 在磁盘上实现的 FIFO 队列(或堆栈),而不是 ram(最好在 C++ 中)

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。基本上,我所追求的是标准模板库队列的等价物,其实现方式是使用磁盘进行存储。需要排队的数据量远远大于当今大多数计算机内存中所能存储的数据量。理想情况下,我正在寻找要使用的图书馆。但是,关于如何实现此队列的任何建议都是有用的。

c++ - 堆栈 std::vector 作用域

我是C++的新手,我发现很难理解某些vector行为。我试图实现一个函数来返回一个int数组,我发现了很多使用这样的vector的建议:vectormyFunc(){vectormyVector;//addelementstovectorhere...returnmyVector;}但据我所知,“myVector”是在堆栈上创建的对象,所以当函数结束时它不会超出范围吗?它的析构函数什么时候被调用?我知道关于返回vector的其他问题很少,但我需要澄清这一点,希望不会重复一个问题。 最佳答案 是的,因为myVector是在堆栈上分配的

c++ - 为什么要在函数调用时填充堆栈?

我在查看函数调用的反汇编时发现了这个:movq%rsp,%rbppushq%rbxsubq$136,%rsp;Padthestack....addq$136,%rsp;Unpadthestackpopq%rbxpopq%rbpret这样做的值(value)是什么? 最佳答案 那是局部变量的空间,不是填充。编译器将在运行此函数时为任何寄存器溢出和必须存储的局部变量创建堆栈空间。当使用SysVABI反汇编x86-64代码时,您可能会看到一些填充(大多数不是Windows的东西,我不知道后者是怎么回事),因为函数调用必须对齐堆栈在16个字